/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo.personas;

import java.util.Calendar;
import java.util.Date;
import javax.persistence.*;

/**
 *
 * @author Raul
 */

@Entity
public class PersonaFisica extends Persona implements Cloneable {
    
    private String apellido;
    private String nombre;
    private String sexo;
    
    @OneToOne(targetEntity = Documento.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Documento documento;
    
    @Temporal(value = TemporalType.DATE)
    private Date fechaNacimiento;

    public PersonaFisica() {
        this.documento = new Documento();
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public Documento getDocumento() {
        return documento;
    }

    public void setDocumento(Documento documento) {
        this.documento = documento;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }
    
    public int getEdad() {
        Calendar birth = Calendar.getInstance();
        birth.setTime(getFechaNacimiento());
        Calendar now = Calendar.getInstance();
        int age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR);
        if (now.get(Calendar.MONTH) < birth.get(Calendar.MONTH) ||
                (now.get(Calendar.MONTH) == birth.get(Calendar.MONTH) &&
                 now.get(Calendar.DAY_OF_MONTH) < birth.get(Calendar.DAY_OF_MONTH)))
                age--;
        return age;
    }
    
    @Override
    public String toString(){
        return apellido+", "+nombre;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof PersonaFisica)) {
            return false;
        }
        final PersonaFisica other = (PersonaFisica) obj;
        if ((this.apellido == null) ? (other.getApellido() != null) : !this.apellido.equals(other.getApellido())) {
            return false;
        }
        if ((this.nombre == null) ? (other.getNombre() != null) : !this.nombre.equals(other.getNombre())) {
            return false;
        }
        if (this.documento != other.getDocumento() && (this.documento == null || !this.documento.equals(other.getDocumento()))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 59 * hash + (this.apellido != null ? this.apellido.hashCode() : 0);
        hash = 59 * hash + (this.nombre != null ? this.nombre.hashCode() : 0);
        hash = 59 * hash + (this.documento != null ? this.documento.hashCode() : 0);
        return hash;
    }
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
            PersonaFisica clon = (PersonaFisica) super.clone();
            clon.setDocumento((Documento) this.documento.clone());
            return clon;
    }
    
}
